<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 一、数据类型
        // 1.基本数据类型：number string boolean undefined null bigInt symbol
        // 2.引用数据类型：object array function RegExp

        // 二、JSON深拷贝
        // var obj1 = {
        //     name: '卡莎',
        //     age: 25,
        //     skill: function() {
        //         console.log("虚空索敌")
        //     }
        // }
        // var obj2 = JSON.parse( JSON.stringify(obj1) )
        // obj2.name = "莎弥拉"
        // console.log(obj1)
        // json深拷贝有缺陷，会忽略function undefined map set

        // 三、终极版本深拷贝
        var obj1 = {
            name: '卡莎',
            age: 25,
            skill: {
                name1: "艾卡西亚暴雨",
                name2: "虚空索敌"
            }
        }
        function deepCopy(obj1) {
            // 判断需要拷贝的是数组还是对象
            var obj2 = Object.prototype.toString.call(obj1) === '[object Array]' ? [] : {}
            for (var key in obj1) {
                // for in会循环原型链上的所有属性，需要判断属性是否是自身属性
                if (obj1.hasOwnProperty(key)) {
                    // 如果属性是复杂数据类型，需要递归继续调用自身
                    if (typeof obj1[key] === "object") {
                        obj2[key] = deepCopy(obj1[key])
                    } else {
                        obj2[key] = obj1[key]
                    }
                }
            }
            return obj2
        }
        var obj2 = deepCopy(obj1)
        obj2.skill.name1 = "111"
        console.log(obj1)





    </script>
</body>
</html>